package com.jqq.threaduse.syn;

/**
 * @author 姬倩倩
 * @version 1.0
 */
public class SellTicket {
    public static void main(String[] args) {
        //
        SellTicket03 sellTicket03 = new SellTicket03();

        new Thread(sellTicket03).start();//第一个线程--窗口
        new Thread(sellTicket03).start();//第二个线程--窗口
        new Thread(sellTicket03).start();//第三个线程--窗口

    }
}
//实现接口方式，使用synchronized实现线程同步
class SellTicket03 implements Runnable{
    private int ticketNum = 100;
    private boolean loop = true;
    Object obj = new Object();

    //静态的同步方法锁在当前类
    public synchronized static void m1(){};//锁在当前类 SellTicket03.class

    public static void m2(){
        synchronized (SellTicket03.class){
            System.out.println("m2");
        }
    }

    //1.public synchronized void sell(), 锁在this对象
    public /*synchronized*/ void sell(){//同步方法，在同一时刻，只能有一个线程来执行sell方法
        //2.synchronized (this) {}, 同步代码块, 锁在this对象
        //3.synchronized (obj) {}, 同步代码块, 锁在同一个obj对象: sellTicket03.obj
        synchronized (/*this*/obj) {
            if (ticketNum <= 0) {
                System.out.println("售票结束..");
                loop = false;
                return;
            }

            //休眠50ms
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println("窗口 " + Thread.currentThread().getName() +
                    " 剩余票数=" + (--ticketNum));
        }
    }
    @Override
    public void run() {
        while(loop){
            sell();//sell方法是一个同步方法
        }
    }
}